fatal_trap(TRAP_nmi, regs);
}
-static void unknown_nmi_error(unsigned char reason, struct xen_regs * regs)
+static void unknown_nmi_error(unsigned char reason)
{
printk("Uhhuh. NMI received for unknown reason %02x.\n", reason);
printk("Dazed and confused, but trying to continue\n");
printk("Do you have a strange power saving mode enabled?\n");
}
-asmlinkage void do_nmi(struct xen_regs * regs, unsigned long reason)
+asmlinkage void do_nmi(struct xen_regs *regs, unsigned long reason)
{
++nmi_count(smp_processor_id());
nmi_watchdog_tick(regs);
else
#endif
- unknown_nmi_error((unsigned char)(reason&0xff), regs);
+ unknown_nmi_error((unsigned char)(reason&0xff));
}
unsigned long nmi_softirq_reason;
return EXCRET_not_a_fault;
}
+BUILD_SMP_INTERRUPT(deferred_nmi, TRAP_deferred_nmi)
+asmlinkage void smp_deferred_nmi(struct xen_regs regs)
+{
+ ack_APIC_irq();
+ do_nmi(®s, 0);
+}
+
void set_intr_gate(unsigned int n, void *addr)
{
_set_gate(idt_table+n,14,0,addr);
set_intr_gate(TRAP_alignment_check,&alignment_check);
set_intr_gate(TRAP_machine_check,&machine_check);
set_intr_gate(TRAP_simd_error,&simd_coprocessor_error);
- set_intr_gate(TRAP_deferred_nmi,&nmi);
+ set_intr_gate(TRAP_deferred_nmi,&deferred_nmi);
#if defined(__i386__)
_set_gate(idt_table+HYPERCALL_VECTOR, 14, 1, &hypercall);
task_slice_t next_slice;
s32 r_time; /* time for new dom to run */
- if ( !is_idle_task(current->domain) )
- {
- LOCK_BIGLOCK(current->domain);
- cleanup_writable_pagetable(prev->domain);
- UNLOCK_BIGLOCK(current->domain);
- }
-
perfc_incrc(sched_run);
spin_lock_irq(&schedule_data[cpu].schedule_lock);
perfc_incrc(sched_ctx);
+ if ( !is_idle_task(current->domain) )
+ {
+ LOCK_BIGLOCK(current->domain);
+ cleanup_writable_pagetable(prev->domain);
+ UNLOCK_BIGLOCK(current->domain);
+ }
+
#if defined(WAKE_HISTO)
if ( !is_idle_task(next) && next->wokenup ) {
ulong diff = (ulong)(now - next->wokenup);